﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using clBUS;
using clEntidad;
using System.IO;
using System.Drawing.Text;
using clEntidad.Ex;
using portero_.Admin;
using portero_.cSeguridad;
using Microsoft.Win32;

namespace portero_
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            String idLoc = "0";
            tsslVersion.Text = "Version " + Application.ProductVersion;
            try
            {
                tsslBD.Text = "BD: " + Constantes.BD_USER + "@" + Constantes.BD_DS;
                tsslUser.Text = "Usuario: " + Constantes.USUARIO.nombre;
                RegistryKey key = Registry.CurrentUser.OpenSubKey(Constantes.REG_KEY, true);
                if (key != null)
                {
                    Object rpta = key.GetValue("Local");
                    if (rpta != null)
                        idLoc = rpta.ToString();
                }

                //idLoc = Varios.getKey("Local", Constantes.REG_KEY);

                BUSLocal objBUS = new BUSLocal(Constantes.CADENA_BD);
                Constantes.LOCAL = objBUS.get(int.Parse(idLoc));
                if (Constantes.LOCAL != null)
                {
                    tsslLocal.Text = "Local: " + Constantes.LOCAL.nombre;
                    dtpFecha.Value = DateTime.Now - DateTime.Now.TimeOfDay;
                    cargar();
                    tbIntro.Focus();
                }
                else
                {
                    MessageBox.Show("Debe configurar el Local", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    tbIntro.Focus();
                }

            }catch(REGException)
            {
                tsslBD.Text = "Sin configurar";
                tsslBD.Image = tsslBD.Image = global::portero_.Properties.Resources.database_delete;
                tbIntro.Focus();
            }

        }

        private void tsbSalir_Click(object sender, EventArgs e)
        {
            
            this.Close();
        }
        private bool buscarReg(int id)
        {
            bool rpta = false;
            foreach (DataGridViewRow row in dgvRegs.Rows)
            {
                if ((int)row.Cells["id"].Value == id)
                {
                    row.Selected = true;
                    return true;
                }
            }
            return rpta;
        }
        private void tsbNew_Click(object sender, EventArgs e)
        {
            if (Constantes.LOCAL != null)
            {
                frmIngreso ofrmIngreso = new frmIngreso();
                ofrmIngreso.ShowDialog(this);
                cargar();
            }
            else
            {
                MessageBox.Show("Debe configurar el Local", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                tbIntro.Focus();
            }
        }
        private void cargar()
        {
            int idSel = 0;
            if (dgvRegs.SelectedRows.Count == 1)
            {
                idSel = (int)dgvRegs.SelectedRows[0].Cells["id"].Value;
            }
            dgvRegs.Rows.Clear();
            BUSRegistro objBUS = new BUSRegistro(Constantes.CADENA_BD);
            int idLocal=0;
            if (Constantes.LOCAL != null)
                idLocal = Constantes.LOCAL.id;
            List<Registro> elems = objBUS.getByFec(dtpFecha.Value, idLocal);
            foreach (Registro elem in elems)
            {
                int numRow = dgvRegs.Rows.Add();
                dgvRegs.Rows[numRow].Cells["id"].Value = elem.id;
                dgvRegs.Rows[numRow].Cells["entrada"].Value = elem.entrada ;
                dgvRegs.Rows[numRow].Cells["numDoc"].Value = elem.persona.numDoc;
                dgvRegs.Rows[numRow].Cells["apePat"].Value = elem.persona.apePat ;
                dgvRegs.Rows[numRow].Cells["apeMat"].Value = elem.persona.apeMat;
                dgvRegs.Rows[numRow].Cells["nombres"].Value = elem.persona.nombres ;
                dgvRegs.Rows[numRow].Cells["empresa"].Value = elem.persona.empresa ;
                if (elem.salio)
                {
                    dgvRegs.Rows[numRow].Cells["salida"].Value = elem.salida;
                    dgvRegs.Rows[numRow].Cells["salio"].Value = global::portero_.Properties.Resources.door_open;
                }
                else
                {
                    dgvRegs.Rows[numRow].Cells["salio"].Value = global::portero_.Properties.Resources.page_white;
                }
            }
            buscarReg(idSel);
            select();
            tbIntro.Focus();
        }

        private void dtpFecha_ValueChanged(object sender, EventArgs e)
        {
            if (Constantes.LOCAL != null)
            {
                cargar();
            }
        }
        int idVisita=0;
        private void select()
        {
            BUSRegistro objBUS = new BUSRegistro(Constantes.CADENA_BD);
            if (dgvRegs.SelectedRows.Count == 1)
            {
                if (dgvRegs.SelectedRows[0].Cells["id"].Value != null)
                {
                    int id = (int)dgvRegs.SelectedRows[0].Cells["id"].Value;
                    idVisita = id;
                    Registro elem = objBUS.get(id);
                    tsbOut.Enabled = !elem.salio;
                    dgvEquipos.Rows.Clear();
                    foreach (Equipo equipo in elem.equipos)
                    {
                        int numRow = dgvEquipos.Rows.Add();
                        dgvEquipos.Rows[numRow].Cells["numserie"].Value = equipo.numSerie;
                        dgvEquipos.Rows[numRow].Cells["tipo"].Value = equipo.tipo;
                        dgvEquipos.Rows[numRow].Cells["marca"].Value = equipo.marca;
                        dgvEquipos.Rows[numRow].Cells["modelo"].Value = equipo.modelo;
                    }

                    if (elem.foto != null)
                    {
                        MemoryStream ms = new MemoryStream();
                        ms.Write(elem.foto, 0, elem.foto.GetUpperBound(0) + 1);
                        Pbx.Image = System.Drawing.Image.FromStream(ms);
                        ms.Close();
                    }
                    else
                    {
                        Pbx.Image = null;
                    }
                }

            }
            else
            {
                dgvEquipos.Rows.Clear();
                idVisita = 0;
                Pbx.Image = null;
                tsbOut.Enabled = false;
            }
        }
        private void dgvRegs_SelectionChanged(object sender, EventArgs e)
        {
            select();
        }

        private void tsbOut_Click(object sender, EventArgs e)
        {
            if (!tsbOut.Enabled)
                return;
            if (dgvRegs.SelectedRows.Count == 1)
            {
                if (dgvRegs.SelectedRows[0].Cells["id"].Value != null)
                {
                    int id = (int) dgvRegs.SelectedRows[0].Cells["id"].Value;
                    String mensaje = "Confirma salida de : \n" +
                        dgvRegs.SelectedRows[0].Cells["apepat"].Value + " " +
                        dgvRegs.SelectedRows[0].Cells["apemat"].Value + ", " +
                        dgvRegs.SelectedRows[0].Cells["nombres"].Value;
                    if (MessageBox.Show(mensaje, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes )
                    {
                        BUSRegistro objBUS = new BUSRegistro(Constantes.CADENA_BD);
                        objBUS.salio (id, Constantes.USUARIO.idLogin);
                        cargar();
                    }
                }
            }
            
        }

        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("¿Desea salir del Portero?", Constantes.cNOMBRE_SIS, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
            {
                e.Cancel = true;
            }

            
        }

        private void tsbGet_Click(object sender, EventArgs e)
        {
            frmFind ofrmFind = new frmFind();
            ofrmFind.ShowDialog();
            if (ofrmFind.id != -1)
            {
                cargar();
            }
        }

        private void frmMain_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.N && e.Modifiers == Keys.Control)
            {
                tsbNew_Click(sender, e);
            }
            else
                if (e.KeyCode == Keys.B && e.Modifiers == Keys.Control)
                {
                    tsbGet_Click(sender, e);
                }
                else
                {

                    if (e.KeyCode == Keys.S && e.Modifiers == Keys.Control)
                    {
                        tsbOut_Click(sender, e);
                    }
                    else
                    {

                        if (e.KeyCode == Keys.P && e.Modifiers == Keys.Control)
                        {
                            tsbPrint_Click(sender, e);
                        }
                    }
                }

        }

        private void frmMain_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.N && e.Modifiers == Keys.Control )
            {
                tsbNew_Click(sender, e);
            }else
                if (e.KeyCode == Keys.B && e.Modifiers == Keys.Control)
                {
                    tsbGet_Click(sender, e);
                }
                else
                {

                    if (e.KeyCode == Keys.S && e.Modifiers == Keys.Control)
                    {
                        tsbOut_Click(sender, e);
                    }
                    else
                    {

                        if (e.KeyCode == Keys.P && e.Modifiers == Keys.Control)
                        {
                            tsbPrint_Click(sender, e);
                        }
                    }
                }

        }

        private void tsbPrint_Click(object sender, EventArgs e)
        {
            int idSel=0;
            if (dgvRegs.SelectedRows.Count == 1)
            {
                idSel = (int)dgvRegs.SelectedRows[0].Cells["id"].Value;

            }
            else
            {
                MessageBox.Show("No hay ningun registro seleccionado para imprimir", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            frmPrint ofrmPrint = new frmPrint();
            ofrmPrint.id = idSel;
            ofrmPrint.printPreviewDialog1.Document = ofrmPrint.printDocument1;
            ofrmPrint.printPreviewDialog1.ShowDialog();
        }
        private void tsbSet_Click(object sender, EventArgs e)
        {
            if (Constantes.CADENA_BD != null)
            {
                if (Constantes.USUARIO.esAdmin)
                {
                    frmConfig ofrmConfig = new frmConfig();
                    ofrmConfig.ShowDialog();
                    if (Constantes.LOCAL != null)
                    {
                        tsslLocal.Text = "Local: " + Constantes.LOCAL.nombre;
                    }
                    cargar();
                }
                else
                {
                    MessageBox.Show("Opción valida solo para administradores", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

            }
            else
            {
                MessageBox.Show("Debe configurar Base de datos", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }


        private void dgvRegs_SelectionChanged_1(object sender, EventArgs e)
        {
            select();
        }

        private void tsbMttoLocal_Click(object sender, EventArgs e)
        {
            if (Constantes.USUARIO.esAdmin)
            {
                frmMttoLocal ofrmMttoLoc = new frmMttoLocal();
                ofrmMttoLoc.ShowDialog();
            }
            else
            {
                MessageBox.Show("Opción valida solo para administradores", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void tsbMttoUsr_Click(object sender, EventArgs e)
        {
            if (Constantes.USUARIO.esAdmin)
            {
                frmMttoUsuario ofrmMttoUsr = new frmMttoUsuario();
                ofrmMttoUsr.ShowDialog();
            }
            else
            {
                MessageBox.Show("Opción valida solo para administradores", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void tsslUser_DoubleClick(object sender, EventArgs e)
        {
        }

        private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            Constantes._logger.Info("Fin");
            frmLogin.ofrmLogin.Close();
        }

        private void tbIntro_Validated(object sender, EventArgs e)
        {
            if (tbIntro.Text.Trim() != "")
            {
                BUSRegistro objBU = new BUSRegistro(Constantes.CADENA_BD);
                int idLocal = 0;
                if (Constantes.LOCAL != null)
                    idLocal = Constantes.LOCAL.id;
                int id = objBU.buscarIngreso(tbIntro.Text, idLocal);
                if (id > 0)
                {
                    frmFind ofrmFind = new frmFind();
                    ofrmFind.id = id;
                    ofrmFind.ShowDialog();
                    cargar();
                    tbIntro.Text = "";
                    tbIntro.Focus();
                }
                else
                {
                    if (id == -1)
                    {
                        if (idLocal != 0)
                        {
                            frmIngreso ofrmIn = new frmIngreso();
                            BUSEquipo objBUEqp = new BUSEquipo(Constantes.CADENA_BD);
                            Equipo equipo = objBUEqp.get(tbIntro.Text);

                            if (equipo != null)
                            {
                                if (equipo.ultVisita != 0)
                                {
                                    BUSPersona objBUPer = new BUSPersona(Constantes.CADENA_BD);
                                    Persona persona = objBUPer.getByUltVisita(equipo.ultVisita);
                                    ofrmIn.numDoc = persona.numDoc;
                                }
                                else
                                {
                                    ofrmIn.numDoc = tbIntro.Text;
                                }
                            }
                            else
                            {
                                ofrmIn.numDoc = tbIntro.Text;
                            }
                            ofrmIn.ShowDialog();
                            cargar();
                            tbIntro.Text = "";
                            tbIntro.Focus();
                        }
                        else
                            MessageBox.Show("Debe configurar el Local", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (id == 0)
                        {
                            if (idLocal != 0)
                            {
                                frmIngreso ofrmIn = new frmIngreso();
                                ofrmIn.numDoc = tbIntro.Text;
                                ofrmIn.ShowDialog();
                                cargar();
                                tbIntro.Text = "";
                                tbIntro.Focus();
                            }
                            else
                                MessageBox.Show("Debe configurar el Local", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }
            //else
            //    tbIntro.Focus();
        }

        private void tbIntro_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");

        }

        private void dgvRegs_Click(object sender, EventArgs e)
        {
            tbIntro.Focus();
        }

        private void dgvEquipos_Click(object sender, EventArgs e)
        {
            tbIntro.Focus();
        }

        private void tbIntro_Enter(object sender, EventArgs e)
        {
            tbIntro.SelectionStart = 0;
            tbIntro.SelectionLength = tbIntro.Text.Length;
        }

        private void cambiarClaveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmCambiaPwd ofrm = new frmCambiaPwd(Constantes.USUARIO.id, false);
            ofrm.ShowDialog();
        }

        private void tsslUser_Click(object sender, EventArgs e)
        {

        }

        private void historialDeAccesosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmAccLog ofrmAL = new frmAccLog(Constantes.USUARIO.id);
            ofrmAL.ShowDialog();
        }

        private void tsbUplMas_Click(object sender, EventArgs e)
        {
            if (Constantes.USUARIO.esAdmin)
            {
                frmCargaMasiva ofrmCM = new frmCargaMasiva();
                ofrmCM.ShowDialog();
            }
            else
            {
                MessageBox.Show("Opción valida solo para administradores", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void tsbExport_Click(object sender, EventArgs e)
        {
            if (Constantes.USUARIO.esAdmin)
            {
                frmExportData ofrmEXP = new frmExportData();
                ofrmEXP.ShowDialog();
            }
            else
            {
                MessageBox.Show("Opción valida solo para administradores", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void Pbx_DoubleClick(object sender, EventArgs e)
        {
            if (idVisita > 0)
            {
                frmVerFoto frm = new frmVerFoto();
                frm.idVisita = idVisita;
                frm.Show();
            }
        }

        private void Pbx_Click(object sender, EventArgs e)
        {

        }
    }
}
